//home模块的小仓库---四部分 state mutations actions getters
//state存储数据的地方
import { reqUserCartList, reqAddCartOrUpdateSkuNum, reqGoodCheckedState, reqDeleteGood } from "@/api";
import { getUserTempId } from "@/utils/userTempId";
const state = {
    //把用户身份存储在小仓库里
    userTempId: getUserTempId(),
    //用来存储购物车的数据
    cartList: []
};
//mutations:唯一可以修改仓库数据的地方
const mutations = {
    GETCARTLIST(state, cartList) {
        state.cartList = cartList;
    }
};
//actions:可以书写业务、逻辑
const actions = {
    //获取购物车的数据
    async getCartList({ state, commit, dispatch }) {
        let result = await reqUserCartList();
        if (result.code == 200) {
            commit('GETCARTLIST', result.data);
        }
    },
    //修改某一个商品的数量
    async updateGoodSkuNum({ state, commit, dispatch }, { skuId, skuNum }) {
        //修改购物车数量返回data：空对象!!!不需要存储任何数据
        let result = await reqAddCartOrUpdateSkuNum(skuId, skuNum);
        if (result.code == 200) {
            return "ok";
        } else {
            return Promise.reject();
        }
    },
    //修改某一个商品的勾选状态
    async updateGoodState({ state, commit, dispatch }, { skuId, isChecked }) {
        let result = await reqGoodCheckedState(skuId, isChecked);
        if (result.code == 200) {
            return 'ok';
        } else {
            return Promise.reject();
        }

    },
    //删除某一个商品
    async deleteGoodBySkuId({ state, commit, dispatch }, skuId) {
        let result = await reqDeleteGood(skuId);
        if (result.code == 200) {
            return 'ok';
        } else {
            return Promise.reject();
        }
    },
    //删除全部选中的商品
    allchecked({ state, commit, dispatch }) {
        let arr = [];
        //将来删除商品请求发三次
        state.cartList[0].cartInfoList.forEach(item => {
            //确保购物车里面的商品选中的要删除掉
            if (item.isChecked == 1) {
                //调用顶部函数deleteGoodBySkuId:返回结果是Promise对象
                let ps = dispatch('deleteGoodBySkuId', item.skuId);
                //向空数组里面追加promise对象
                arr.push(ps);
            }

        })
        //当前函数allchecked,返回的结果是一个Promise对象,成功还是失败。取决于
        //arrPromise状态:如果三个ps都是成功状态,当前函数返回的结果即为成功的Promise
        //只要有一个ps失败的状态，当前函数返回结尾失败的Promise对象
        return Promise.all(arr);
    },
    //全选的操作
    changeChecked({ state, commit, dispatch }, isChecked) {
        let arr = [];
        //获取仓库里面全部的商品
        state.cartList[0].cartInfoList.forEach(item => {
            let ps = dispatch("updateGoodState", { skuId: item.skuId, isChecked });
            arr.push(ps);
        });
        return Promise.all(arr);
    }

};
//计算属性getters
const getters = {
    //取出数组第零项元素
    info(state) {
        return state.cartList[0] || {}
    },
    goods(state, getters) {
        return getters.info.cartInfoList || []
    }
};

//对外暴露小仓库
export default {
    namespaced: true,
    state,
    mutations,
    actions,
    getters
}


